﻿using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioLogradouro : IRepositorioLogradouro
    {
        public Logradouro Inserir(Logradouro logradouro)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Save(logradouro);
            return logradouro;
        }

        public Logradouro Atualizar(Logradouro logradouro)
        {
            Logradouro tmpLogradouro = ObterPorId(logradouro.LogradouroId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpLogradouro.Bairro = logradouro.Bairro;
            tmpLogradouro.Cep = logradouro.Cep;
            tmpLogradouro.Codigo = logradouro.Codigo;
            tmpLogradouro.Descricao = logradouro.Descricao;
            tmpLogradouro.NeturionLog = logradouro.NeturionLog;
            tmpLogradouro.TipoLogradouro = logradouro.TipoLogradouro;

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpLogradouro);
            return tmpLogradouro;
        }

        public void Excluir(Logradouro logradouro)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(logradouro);
        }

        public IList<Logradouro> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Logradouro));
            return criteria.List<Logradouro>() as List<Logradouro>;
        }

        public IList<Logradouro> ObterTodos(int inicio, int quantidade, int quantidadeMinima, Cidade cidade, Bairro bairro, TipoLogradouro tipoLogradouro, string descricao)
        {
            if (quantidade.Equals(0))
            {
                quantidade = quantidadeMinima;
            }

            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Logradouro))
               .SetFirstResult(inicio).SetMaxResults(quantidade);

            if (!String.IsNullOrEmpty(descricao))
            {
                criteria.Add(Restrictions.Like("Descricao", descricao, MatchMode.Anywhere));
            }

            if(cidade!= null)
            {
                criteria.CreateAlias("Bairro", "Bairro").Add(Restrictions.Eq("Bairro.Cidade", cidade));
            }

            if(bairro != null)
            {
                criteria.Add(Restrictions.Eq("Bairro", bairro));
            }

            if (tipoLogradouro != null)
            {
                criteria.Add(Restrictions.Eq("TipoLogradouro", tipoLogradouro));
            }

            return criteria.List<Logradouro>() as List<Logradouro>;
        }

        public Logradouro ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<Logradouro>(id);
        }

        public Logradouro ObterPorCodigo(string codigo)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Logradouro))
                .Add(Restrictions.Eq("Codigo",codigo));
            return criteria.UniqueResult<Logradouro>();
        }

        public IList<Logradouro> ObterPorCep(string cep)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Logradouro))
                .Add(Restrictions.Eq("Cep", cep));
            return criteria.List<Logradouro>() as List<Logradouro>;
        }

        public IList<Logradouro> ObterPorDescricao(string descricao)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(Logradouro))
                .Add(Restrictions.Like("Descricao",descricao,MatchMode.Anywhere));
            return criteria.List<Logradouro>() as List<Logradouro>;
        }
    }
}